The +O Selftest for Crackers
LordByte Cracking Challange version 1.0


Tutorial (v1.0) by Lucifer48 [Immortal Descendants]
(12 Ao√t 1999)


Contents:
Introduction
Very Very Easy
Very Easy
Easy
Not Entirely Easy
Somewhat Harder
Hard


Introduction:

Je n'ai rΘsolu que 5 tests sur 7, (Not Entirely Easy & Very Hard). Ce dernier est carrΘment un truc de fou, il est Θnorme, j'ai abandonnΘ (je doute que quelqu'un soit assez courageux pour rΘsourdre τa !). Quand α l'autre c'est une brute force α 9 caractΦres donc τa prend du temps... Si vous avez des infos: d'autres combinaisons (pour Hard), word du (Not Entirely Easy) ou la pass-phrase (Very Hard), ou autre chose qui est susceptible de faire avancer ce tut; Θcrivez moi α lucifer48@yahoo.com. Je serais ravi d'updater ce tutorial.


Very Very Easy:

C'est une simple comparaison...
XXXX:0043B032  LEA  EDX,[EBP-04]          ;[EBP-04] va contenir l'adresse du serial
XXXX:0043B035  MOV  EAX,[EBX+00000258]
XXXX:0043B03B  CALL 0041AED4              ;lit le serial
XXXX:0043B040  MOV  EAX,[EBP-04]          ;notre serial
XXXX:0043B043  MOV  EDX,0043B09C          ;button
XXXX:0043B048  CALL 00403A44              ;comparaison
XXXX:0043B04D  JNZ  0043B05B              ;jump = bad cracker!
What word am I thinking of ? button


Very Easy:

Allons y...
XXXX:0043B1D7  CALL 0041AED4              ;lecture du nom
XXXX:0043B1DC  MOV  EAX,[EBP-08]          ;mon nom
XXXX:0043B1DF  CALL 00403934
XXXX:0043B1E4  MOV  EBX,EAX               ;contient la taille du nom
XXXX:0043B1E6  TEST EBX,EBX               ;a t'on rentrΘ un nom ?
XXXX:0043B1E8  JLE  043B20E
XXXX:0043B1EA  MOV  ESI,00000001
XXXX:0043B1EF  LEA  EDX,[EBP-08]          ;va contenir l'adresse du nom..
XXXX:0043B1F2  MOV  EAX,[EBP-04]          ;alors qu'elle est dΘjα lα...
XXXX:0043B1F5  MOV  EAX,[EAX+00000280]    ;qu'il est con ce delphi ;)
XXXX:0043B1FB  CALL 0041AED4              ;lecture du nom (encore...)
XXXX:0043B200  MOV  EAX,[EBP-08]          ;d EAX: mon nom
XXXX:0043B203  MOVZX EAX,BYTE PTR [ESI+EAX-01]  ;charge le ESI Φme caractΦre du nom
XXXX:0043B208  ADD  EDI,EAX               ;EDI vaut initialement: 031422DD
XXXX:0043B20A  INC  ESI                   ;caractΦre suivant
XXXX:0043B20B  DEC  EBX
XXXX:0043B20C  JNZ  0043B1EF              ;boucle
Cette modeste boucle additionne donc la valeur ascii de chaque caractΦre du nom, + 031422DD, ce qui donne un joli checksum sur 32 bits. Un peu plus loin...
XXXX:0043B228  CALL 00406870              ;lecture du serial
XXXX:0043B22D  MOV  EAX,[EBP-08]          ;d EAX: mon serial
XXXX:0043B230  CALL 00406870              ;conversion hΘxadΘcimale (rΘsultat en EAX)
XXXX:0043B235  CMP  EDI,EAX               ;comparaison
XXXX:0043B237  JNZ  0043B245              ;faut que τa soit Θgal!
Pour mon nom j'obtiens:
31422DDh + 4Ch + 75h + 63h + 69h + 66h + 65h + 72h + 34h + 38h = 3142613h
et deplus, 3142613h = 51652115d donc...
  Name/ Lucifer48
Serial/ 51652115
A noter que ce genre de protection peut Ωtre rencontrΘ dans de nombreux sharewares.


Easy:

Bien qu'on soit autorisΘ α patcher, je ne le ferais pas... On veut devenir est VRAIs crackers oui ou non ? A l'issu d'une boucle, on aboutit a quelques (2 en fait) comparaisons:
XXXX:0043B3FA  CMP  ESI,00003810
XXXX:0043B400  JNZ  0043B40A
XXXX:0043B402  CMP  EBX,402A4FE7
XXXX:0043B408  JZ   0043B424
...
XXXX:0043B424  MOV  EAX,EBX               ;on est sur que EBX=402A4FE7
XXXX:0043B426  SUB  EAX,ESI               ;et que ESI=00003810 donc...
XXXX:0043B428  CMP  EAX,402A17D7          ;le test est forcΘment vΘrifiΘ !
XXXX:0043B42D  JZ   0043B449              ;donc ici JZ = JMP
...
XXXX:0043B449  MOV  EAX,EBX               ;encore une fois, on est sur que EBX=402A4FE7
XXXX:0043B44B  ADD  EAX,EAX               ;402A4FE7 + 402A4FE7 = 80549FEC
XXXX:0043B44D  LEA  EDX,[ESI*2+ESI]       ;ESI=00003810 donc 3*ESI=00007020
XXXX:0043B450  ADD  EAX,EDX               ;80549FEC + 00007020 = 805547FE
XXXX:0043B452  CMP  EAX,805547FE
XXXX:0043B457  JZ   0043B473              ;ici encore, JZ = JMP
Passons maintenant α ce que fait la boucle. La boucle la plus interne fait la chose suivante: Posons Xk le k-Φme caractΦre du serial, EDI faut initialement 1 et il s'itΦre jusqu'α la longueur du serial.
ESI= Xk + ESI + EDI
EBX= (2*EBX XOR ESI) + ESI MOD EDI + 1
Supposons que le serial fait n caractΦres, je note X1, X2, ..., Xk, ..., Xn les caratΦres du serial.

A la fin de la boucle (interne):
  ESI = (1 + 2 + ... + n ) + X1 + X2 + ... + Xn
      = n*(n+1)/2 + Sigma(1,n,k) Xk                  (k est l'indice de boucle qui varie de 0 α n)
Sachant que la deuxiΦme boucle (la plus externe), rΘpΦte simplement 10h fois la boucle interne, alors, on peut calculer ESI final (celui qui va Ωtre comparΘ).
ESI (final)= 8*n*(n+1) + 16*Sigma(1,n,k) Xk
Et on sait que ESI doit valoir 00003810, et que 00003810 / 10h = 381
donc conclusion: 381h = n*(n+1)/2 + Sigma(1,n,k) Xk (*)

(*) Cette equation va donc beaucoup nous aider pour notre brute force attack (α vrai dire, je vois pas d'autres mΘthodes !) τa va en effet enlever pas mal de possibilitΘs.
XXXX:0043B3F0  DEC  DWORD PTR [EBP-0C]
XXXX:0043B3F3  JNZ  0043B3C3               ;boucle interne
XXXX:0043B3F5  DEC  DWORD PTR [EBP-08]
XXXX:0043B3F8  JNZ  0043B39E               ;boucle externe
Remarque: En effectuant un rapide calcul, on peut prΘsentir que le serial (le word) fait 8 caractΦres de long. En effet:
	7 chars: 381h-1Ch = 365h et 365h / 7 = 7Ch (moyenne des valeurs ascii des caractΦres)
	8 chars: 381h-24h = 35Dh et 35Dh / 8 = 6Bh
	9 chars: 381h-2Dh = 354h et 354h / 9 = 5Eh
On devine aussi que le word se terminera par une lettre e, un peu de brute force (voir ma source en asm), et on obtient:

What word am I thinking of ? firmware


Not Entirely Easy:

Ce test est excatement le mΩme (α deux instructions prΦs) que le prΘcΘdent.
XXXX:0043B593  MOV  EAX,ESI
XXXX:0043B595  CDQ
XXXX:0043B596  IDIV EDI                    ;EDI varie de 1 α longueur-du-serial
XXXX:0043B598  ADD  EDX,03
XXXX:0043B59B  SUB  EBX,EDX
XXXX:0043B59D  INC  EDI
XXXX:0043B59E  DEC  DWORD PTR [EBP-0C]     ;boucle interne
XXXX:0043B5A1  JNZ  0043B56F
XXXX:0043B5A3  DEC  DWORD PTR [EBP-08]     ;16 boucles (comme le test prΘcΘdent)
XXXX:0043B5A6  JNZ  0043B54A
XXXX:0043B5A8  CMP  ESI,00004100
XXXX:0043B5AE  JNZ  0043B5B8
XXXX:0043B5B0  CMP  EBX,F61D4A8F
XXXX:0043B5B6  JZ   0043B5D2               ;jmp = good cracker!
Comme ci-dessus voilα les deux formules:
ESI= Xk + ESI + EDI
EBX= (2*EBX XOR ESI) - ESI MOD EDI - 3
Vous voyez c'est pas trΦs diffΘrent ! Et comme ci-dessus, on va se reservir de ca: 410h = n*(n+1)/2 + Sigma(1,n,k) Xk pour Θcarter des possibilitΘs.

On devine (on espΦre...) que le word est en minuscules.
	7 chars: 410h-1Ch = 3F4h et 3F4h / 7 = 90h (ca fait beaucoup...)
	8 chars: 410h-24h = 3ECh et 3ECh / 8 = 7Dh (c'est trop aussi)
	9 chars: 410h-2Dh = 3E3h et 3E3h / 9 = 6Eh <--- ca devrait aller
	A chars: 410h-37h = 3D9h et 3D9h / A = 62h (trop petit ci c'est que des minuscules)
EspΘrons que le serial face bien 9 caractΦres...

Je vois pas d'autres solutions ici que la brute force dommage (voir source).


Somewhat Harder:

Grace W32Dasm et aux Strings Refs, (en particulier α "Correct Key ! ..."), on peut mettre un bpx au bon endroit.
XXXX:0043B8CF  CALL 00403B38
XXXX:0043B8D4  MOV  EAX,[EBP-04]
XXXX:0043B8D7  CALL 00406870                  ;EAX contient la valeur du slide
XXXX:0043B8DC  IMUL EBX,EAX,000DEAAD
...
Soient X1, X2, ..., X8 les valeurs des 8 slides. Que fait ce test:
Deux fois, quatres inconnus (seulement), trop facile... Voir source en pascal, qui donne la solution:

86257479

Key Status: Valid !!!!!


Hard:

Comme pour le test prΘcΘdent, W32Dasm nous aide α trouver l'adresse pour mettre un bpx.
XXXX:0043BB7F  MOV  EDI,39F51B20
XXXX:0043BB84  MOV  DWORD PTR [ESP],118DF6E7
XXXX:0043BB8B  MOV  ESI,202937CD
XXXX:0043BB90  MOV  EBP,6FB25085
XXXX:0043BB95  MOV  EAX,[EBX+00000398]          ;A1
XXXX:0043BB9B  CALL 00430398                    ;la case est-elle cochΘe ? (al=01=case cochΘe)
XXXX:0043BBA0  TEST AL,AL
XXXX:0043BBA2  JZ   0043BBC3                    ;saut vers le test suivant
En fait le crackme parcourt toutes les cases et vΘrifie si elles sont cochΘes, si c'est le cas alors les valeurs (EDI, ESI, EBP, DWORD PTR [ESP) subissent des modifications (opΘrations arithmΘtiques, sar, ...), et α la fin, on teste de la faτon suivante:
XXXX:0043C260  SUB  EDI,[ESP]
XXXX:0043C263  ADD  ESI,EDI
XXXX:0043C265  ADD  EBP,ESI
XXXX:0043C267  CMP  EBP,76651C4D
XXXX:0043C26D  JNZ  0043C2D0                    ;no jump = good cracker!
C'est assez original, je trouve. Encore une fois, la brute force va nous aider! (heureusement les tests des cases sont effectuΘes dans l'ordre). Il y 39 cases, τa fait 2^39 possibilitΘs (τa fait beaucoup). Toutes les sΘquences d'intructions qui suivent les tests des cases se ressemblent α peu prΦs toutes sauf trois: A4, C4 et C13.

Avec ma source en asm (j'espΦre qu'il n'y a pas d'erreurs dedans....), voilα la premiΦre bonne combinaison que j'ai trouvΘe:
X X X O X O O O O X O O X
O O X X X O X O X X O X O
X X O X X O O O O O O O O
Remarque: Pour information j'ai essayΘ toutes les combinaisons de A1 α C7 (C8, C9, ..., C13 non cochΘ), il n'y a donc qu'une unique solution dans cet intervalle.


Greetings: All ID members (Volatility, Torn@do, ...), Eternal Bliss, ACiD BuRN, LaZaRuS, Duelist, ...



(c) Lucifer48. All rights reversed